import dayjs from 'dayjs'

/**
 * formatDate 格式化时间
 */
export const formatDate = (val, type) => {
  if (!val || val === '') return '-'

  switch (type) {
    case '/':
      return dayjs(val).format('YYYY/M/D HH:mm:ss')
    case '.':
      return dayjs(val).format('YYYY.MM.DD HH:mm:ss')
    case 'zh':
      return dayjs(val).format('YYYY年MM月DD日')
    case 'YMD':
      return dayjs(val).format('YYYY-MM-DD')
    case 'MD':
      return dayjs(val).format('MM-DD')
    case 'TIME':
      return dayjs(val).valueOf()
    case 'DATE':
      return `${dayjs(val).format('YYYY-MM-DDTHH:mm:ss.SSS')}`
    default:
      return dayjs(val).format(type || 'YYYY-MM-DD HH:mm:ss')
  }
}

/**
 * 计算相差时间
 */
export const formatAgo = (str) => {
  if (!str) return ''
  const date = new Date(Number(str))
  const time = new Date().getTime() - date.getTime() // 现在的时间-传入的时间 = 相差的时间（单位 = 毫秒）
  if (time < 0) {
    return ''
  } else if (time / 1000 < 30) {
    return '刚刚'
  } else if (time / 1000 < 60) {
    return parseInt(String(time / 1000)) + '秒前'
  } else if (time / 60000 < 60) {
    return parseInt(String(time / 60000)) + '分钟前'
  } else if (time / 3600000 < 24) {
    return parseInt(String(time / 3600000)) + '小时前'
  } else if (time / 86400000 < 31) {
    return parseInt(String(time / 86400000)) + '天前'
  } else if (time / 2592000000 < 12) {
    return parseInt(String(time / 2592000000)) + '月前'
  } else {
    return parseInt(String(time / 31536000000)) + '年前'
  }
}

/**
 * 自定义格式化时间
 * @param {(Object|string|number)} time 时间
 * @param {string} cFormat 格式
 * @returns {string | null}
 */
export function parseTime(time, cFormat) {
  if (arguments.length === 0 || !time) {
    return null
  }

  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
  let date, self

  if (typeof time === 'object') {
    date = time
  } else {
    if (typeof time === 'string') {
      if (/^[0-9]+$/.test(time) && time.length === 13) {
        self = Number(time)
      } else if (/^[0-9]+$/.test(time) && time.length === 10) {
        self = time * 1000
      } else {
        self = time
      }
    } else if (typeof time === 'number') {
      if (time.toString().length === 10) {
        self = time * 1000
      } else if (time.toString().length === 13) {
        self = time
      } else {
        return null
      }
    }
    date = new Date(self)
  }

  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }
  const timeStr = format.replace(/{([ymdhisa])+}/g, (result, key) => {
    const value = formatObj[key]
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value]
    }
    return value.toString().padStart(2, '0')
  })
  return timeStr
}
